/**
 * 位置相关工具类
 */

/**
 * 根据经纬度获取两点之间的直线距离
 * @param lat1 - 地点1纬度
 * @param lng1 - 地点1经度
 * @param lat2 - 地点2纬度
 * @param lng2 - 地点2经度
 * @param fixed - 小数点后几位
 * @returns 距离（公里）
 */
export const calculateDistance = (lat1: number, lng1: number, lat2: number, lng2: number, fixed: number) => {
    const toRadians = (degrees: number) => degrees * Math.PI / 180;

    const R = 6371; // 地球半径(公里)
    const φ1 = toRadians(lat1);
    const φ2 = toRadians(lat2);
    const Δφ = toRadians(lat2 - lat1);
    const Δλ = toRadians(lng2 - lng1);

    const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
        Math.cos(φ1) * Math.cos(φ2) *
        Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

    return (R * c).toFixed(fixed); // 最终距离(公里)
};

/**
 * 格式化距离显示
 * @param distance - 距离（米）
 * @returns 格式化后的距离字符串，如 "321m" 或 "7.3km"
 */
export const formatDistance = (distance: number): string => {
    if (distance < 1000) {
        return `${Math.round(distance)}m`;
    } else {
        const km = distance / 1000;
        // 如果公里数是整数，不显示小数点
        if (km % 1 === 0) {
            return `${km}km`;
        } else {
            // 保留一位小数
            return `${km.toFixed(1)}km`;
        }
    }
};

/**
 * 获取用户当前位置
 * @returns Promise<{latitude: number, longitude: number}>
 */
export const getCurrentLocation = (): Promise<{latitude: number, longitude: number}> => {
    return new Promise((resolve, reject) => {
        // 这里需要根据实际项目使用的位置获取API
        // 示例使用微信小程序的位置API
        if (typeof wx !== 'undefined' && wx.getLocation) {
            wx.getLocation({
                type: 'wgs84',
                success: (res) => {
                    resolve({
                        latitude: res.latitude,
                        longitude: res.longitude
                    });
                },
                fail: (error) => {
                    reject(error);
                }
            });
        } else {
            // 模拟位置数据
            resolve({
                latitude: 22.817002,
                longitude: 108.366543
            });
        }
    });
};

/**
 * 检查位置权限
 * @returns Promise<boolean>
 */
export const checkLocationPermission = (): Promise<boolean> => {
    return new Promise((resolve) => {
        if (typeof wx !== 'undefined' && wx.getSetting) {
            wx.getSetting({
                success: (res) => {
                    resolve(res.authSetting['scope.userLocation'] === true);
                },
                fail: () => {
                    resolve(false);
                }
            });
        } else {
            resolve(true);
        }
    });
};

/**
 * 请求位置权限
 * @returns Promise<boolean>
 */
export const requestLocationPermission = (): Promise<boolean> => {
    return new Promise((resolve) => {
        if (typeof wx !== 'undefined' && wx.authorize) {
            wx.authorize({
                scope: 'scope.userLocation',
                success: () => {
                    resolve(true);
                },
                fail: () => {
                    resolve(false);
                }
            });
        } else {
            resolve(true);
        }
    });
};
